<?php
declare (strict_types=1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;


class CreateEgoldLogTable extends Command
{
    // 分表数量
    protected $number = 50;

    // 表前缀
    protected $tablePre      = 'ziyi_egold_log_';
    protected $countTablePre = 'ziyi_egold_count_log_';


    protected function configure()
    {
        // 指令配置
        $this->setName('create_egold_log')
            ->setDescription('创建消费记录分表');
    }

    protected function execute(Input $input, Output $output)
    {
        // 连接阅读库
        $connect = Db::connect('egold_log');

        // 删除表 测试使用
        // $this->dropTable($connect);
        // $this->dropCountTable($connect);

        for ($i = 0; $i < $this->number; $i++) {
            $table = $this->tablePre . $i;
            // 创建表
            $connect->execute("
                CREATE TABLE `{$table}` (
                    `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
                    `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID',
                    `type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '类型 1 充值 2 充値赠送 3 消费 4签到赠送 5签到分享赠送 6签到助力赠送 7仼务赠送 8赠币过期 9分享赠送 10助力活动',
                    `title` varchar(50) NOT NULL DEFAULT '' COMMENT '标题备注',
                    `book_id` int(11) NOT NULL DEFAULT 0 COMMENT '书籍ID',
                    `book_name` varchar(150) NOT NULL DEFAULT '' COMMENT '书籍名称',
                    `chapter_id` int(11) NOT NULL DEFAULT 0 COMMENT '章节ID',
                    `chapter_name` varchar(150) NOT NULL DEFAULT '' COMMENT '童节名称',
                    `egold` int(11) NOT NULL DEFAULT 0 COMMENT '书币数量',
                    `used_egold` int(11) NOT NULL DEFAULT 0 COMMENT '消耗书币',
                    `zb` int(11) NOT NULL DEFAULT 0 COMMENT '消耗赠币',
                    `buytype` tinyint(1) NOT NULL DEFAULT 0 COMMENT '购买类别 1:阅读币消费  2:打赏消费 3:包月消费 4:赠币消费 5:全本购买 6:混合购买',
                    `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
                    `update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
                    `expire_time` int(11) NOT NULL DEFAULT 0 COMMENT '过期时间',
                    PRIMARY KEY (`id`)
                )DEFAULT CHARSET=utf8mb4 COMMENT='消费记录表';
            ");

            // 添加索引
            $connect->execute("ALTER TABLE `{$table}` ADD INDEX idx_user_id(`user_id`);");
            $connect->execute("ALTER TABLE `{$table}` ADD INDEX idx_type(`type`);");
            $connect->execute("ALTER TABLE `{$table}` ADD INDEX idx_chapter_id(chapter_id);");
            $connect->execute("ALTER TABLE `{$table}` ADD INDEX idx_buytype(buytype);");
        }

        //  赠币记录表
        for ($i = 0; $i < $this->number; $i++) {
            $countTable = $this->countTablePre . $i;
            // 创建表
            $connect->execute("
                CREATE TABLE `{$countTable}` (
                    `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
                    `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID',
                    `egold_log_id` int(11) NOT NULL DEFAULT 0 COMMENT '消费表ID',
                    `egold` int(11) NOT NULL DEFAULT 0 COMMENT '书币',
                    `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
                    `expire_time` int(11) NOT NULL DEFAULT 0 COMMENT '过期时间',
                    `delete_time` int(11) NOT NULL DEFAULT 0 COMMENT '作废时间',
                    PRIMARY KEY (`id`)
                )DEFAULT CHARSET=utf8mb4 COMMENT='赠币记录表';
            ");
            // 添加索引
            $connect->execute("ALTER TABLE `{$countTable}` ADD INDEX idx_user_id(`user_id`);");
            $connect->execute("ALTER TABLE `{$countTable}` ADD INDEX idx_egold_log_id(egold_log_id);");
        }

        // 指令输出
        $output->writeln('创建消费记录分表完成');
    }


    protected function dropTable($connect)
    {
        for ($i = 0; $i < $this->number; $i++) {
            $table = $this->tablePre . $i;
            $connect->execute("DROP TABLE IF EXISTS {$table};");
        }
    }

    protected function dropCountTable($connect)
    {
        for ($i = 0; $i < $this->number; $i++) {
            $table = $this->countTablePre . $i;
            $connect->execute("DROP TABLE IF EXISTS {$table};");
        }
    }
}
